﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Notifications;

namespace StyleMVVM.Notification.Tile
{
	/// <summary>
	/// This interface provides a wrapper around TileUpdater as well as providing an easy way to generate Tile updates
	/// </summary>
	public interface ITileService
	{
		ITileSquareImage CreateTileSquareImage();

		ITileSquareBlock CreateTileSquareBlock();

		ITileSquareText01 CreateTileSquareText01();

		ITileSquareText02 CreateTileSquareText02();

		ITileSquareText03 CreateTileSquareText03();

		ITileSquareText04 CreateTileSquareText04();

		ITileSquarePeekImageAndText01 CreateTileSquarePeekImageAndText01();

		ITileSquarePeekImageAndText02 CreateTileSquarePeekImageAndText02();

		ITileSquarePeekImageAndText03 CreateTileSquarePeekImageAndText03();

		ITileSquarePeekImageAndText04 CreateTileSquarePeekImageAndText04();

		ITileWideImageCollection CreateTileWideImageCollection();

		ITileWideImageAndText01 CreateTileWideImageAndText01();

		ITileWideImageAndText02 CreateTileWideImageAndText02();

		ITileWideImage CreateTileWideImage();

		ITileWideBlockAndText01 CreateTileWideBlockAndText01();

		ITileWideBlockAndText02 CreateTileWideBlockAndText02();

		ITileWidePeekImageCollection01 CreateTileWidePeekImageCollection01();

		ITileWidePeekImageCollection02 CreateTileWidePeekImageCollection02();

		ITileWidePeekImageCollection03 CreateTileWidePeekImageCollection03();

		ITileWidePeekImageCollection04 CreateTileWidePeekImageCollection04();

		ITileWidePeekImageCollection05 CreateTileWidePeekImageCollection05();

		ITileWidePeekImageCollection06 CreateTileWidePeekImageCollection06();

		ITileWidePeekImageAndText01 CreateTileWidePeekImageAndText01();

		ITileWidePeekImageAndText02 CreateTileWidePeekImageAndText02();

		ITileWidePeekImage01 CreateTileWidePeekImage01();

		ITileWidePeekImage02 CreateTileWidePeekImage02();

		ITileWidePeekImage03 CreateTileWidePeekImage03();

		ITileWidePeekImage04 CreateTileWidePeekImage04();

		ITileWidePeekImage05 CreateTileWidePeekImage05();

		ITileWidePeekImage06 CreateTileWidePeekImage06();

		ITileWideSmallImageAndText01 CreateTileWideSmallImageAndText01();

		ITileWideSmallImageAndText02 CreateTileWideSmallImageAndText02();

		ITileWideSmallImageAndText03 CreateTileWideSmallImageAndText03();

		ITileWideSmallImageAndText04 CreateTileWideSmallImageAndText04();

		ITileWideSmallImageAndText05 CreateTileWideSmallImageAndText05();

		ITileWideText01 CreateTileWideText01();

		ITileWideText02 CreateTileWideText02();

		ITileWideText03 CreateTileWideText03();

		ITileWideText04 CreateTileWideText04();

		ITileWideText05 CreateTileWideText05();

		ITileWideText06 CreateTileWideText06();

		ITileWideText07 CreateTileWideText07();

		ITileWideText08 CreateTileWideText08();

		ITileWideText09 CreateTileWideText09();

		ITileWideText10 CreateTileWideText10();

		ITileWideText11 CreateTileWideText11();

		/// <summary>
		/// Clears the current tile information
		/// </summary>
		void Clear();

		/// <summary>
		/// Returns a list of notifications that are scheduled for the main tile
		/// </summary>
		/// <returns></returns>
		IReadOnlyList<ScheduledTileNotification> GetScheduledTileNotifications();

		/// <summary>
		/// Enabled notification queing for the TileUpdater
		/// </summary>
		/// <param name="enabled"></param>
		void EnableNotificationQueue(bool enabled);

		/// <summary>
		/// Schedules a tile update for the specified time offset
		/// </summary>
		/// <param name="update"></param>
		/// <param name="offSet"></param>
		/// <returns></returns>
		ScheduledTileNotification AddToSchedule(ITileUpdate update, DateTimeOffset offSet);

		/// <summary>
		/// Remove the specified tile notification
		/// </summary>
		/// <param name="notification"></param>
		void RemoveFromSchedule(ScheduledTileNotification notification);

		/// <summary>
		/// Start a periodic tile update based on a uri and a recurrence period
		/// </summary>
		/// <param name="uri"></param>
		/// <param name="recurrence"></param>
		void StartPeriodicUpdate(Uri uri, PeriodicUpdateRecurrence recurrence);

		/// <summary>
		/// Start a periodic tile update based on a provided uri, time offset and recurrence period
		/// </summary>
		/// <param name="uri"></param>
		/// <param name="startOffSet"></param>
		/// <param name="recurrence"></param>
		void StartPeriodicUpdate(Uri uri, DateTimeOffset startOffSet, PeriodicUpdateRecurrence recurrence);

		/// <summary>
		/// Stop all periodic updates for the main tile
		/// </summary>
		void StopPeriodicUpdate();

		/// <summary>
		/// Update the main application tile with the provided update
		/// </summary>
		/// <param name="update"></param>
		void Update(ITileUpdate update);
	}
}